﻿using System;
using System.Drawing.Printing;
using System.Windows.Forms;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
namespace PresentacionWindows.Base
{
	/// <summary>
	/// Clase estatica de ayuda para el manejo de 
	/// informes Crystal Reports
	/// </summary>
	public class ControlReports
	{
		private ControlReports(){}

		/// <summary>
		/// Exporta el informe a PDF.
		/// </summary>
		/// <param name="report">Informe que se desea exportar</param>
		/// <param name="fichero">Ruta del fichero PDF que se va a crear</param>
		public static void ExportarPDF(ReportDocument  report, string fichero) 
		{
			report.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4;
			report.ExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
			report.ExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
			DiskFileDestinationOptions dfo = new DiskFileDestinationOptions();
			dfo.DiskFileName = fichero;
			report.ExportOptions.DestinationOptions = dfo;
			report.Export();
		}


		/// <summary>
		/// Exporta un informe a PDF.
		/// </summary>
		/// <param name="report">Ruta del fichero de report (.rpt)</param>
		/// <param name="dataSource">Objeto de datos</param>
		/// <param name="fichero">Ruta del fichero PDF que se va a crear</param>
		public static void ExportarPDF(string report, object dataSource, string fichero) 
		{
			ReportDocument impreso = new ReportDocument();
			impreso.Load(report);
			impreso.SetDataSource(dataSource);

			ExportarPDF(impreso,fichero);
		}

		/// <summary>
		/// Muestra el formulario de vista previa del informe.
		/// </summary>
		/// <param name="report">Informe que se muestra</param>
		/// <param name="parentForm">Formulario padre para la ventana de vista previa</param>
		public static void VistaPrevia(ReportDocument report, Form parentForm) 
		{
			frmVisorReports visor = new frmVisorReports();
			visor.Informe = report;
			visor.ShowDialog(parentForm);
		}

		/// <summary>
		/// Imprime el report directamente por impresora
		/// </summary>
		/// <param name="report"></param>
		public static void Imprimir(ReportDocument report) 
		{
			Imprimir(report, new PrintDocument());
		}

		/// <summary>
		/// Imprime el report según los parámetros de impresión definidos en el PrintDocument
		/// </summary>
		/// <param name="report">Impreso que se quiere configurar</param>
		/// <param name="printDoc">PrintDocument con los parámetros de impresión (se puede obtener de un PrintDialog)</param>
		public static void Imprimir(ReportDocument impreso, PrintDocument printDoc) 
		{
			//impreso.PrintOptions.PrinterName = ControlImpresion.ImpresoraDefecto;
			impreso.PrintOptions.PrinterName = printDoc.PrinterSettings.PrinterName;
			//Establecemos duplex (posibilidad de imprimir por ambas caras)
			switch(printDoc.PrinterSettings.Duplex)
			{
				case System.Drawing.Printing.Duplex.Default:
				{
					impreso.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Default;
					break;
				}
				case System.Drawing.Printing.Duplex.Horizontal:
				{
					impreso.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Horizontal;
					break;
				}
				case System.Drawing.Printing.Duplex.Simplex:
				{
					impreso.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Simplex;
					break;
				}
				case System.Drawing.Printing.Duplex.Vertical:
				{
					impreso.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Vertical;
					break;
				}
			}

			//ÑAPA
			//Hacemos esto de repetir la llamada a la impresión
			//porque la propiedad printDocument1.PrinterSettings.Collate no funciona bien
			//y entonces nunca intercala, con lo cual no tiene mucho sentido que saque varias copias
			//y que no estén separadas
			for (int i=1;i<=printDoc.PrinterSettings.Copies;i++)
			{
				impreso.PrintToPrinter(1 ,printDoc.PrinterSettings.Collate,0,0);
			}			
		}

	}
}

